﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//
//	//分配n个整型大小的内存
//	int* p = (int*)malloc(n * sizeof(int));
//
//	//判断内存是否分配成功
//	if (p == null)
//	{
//		perror("malloc");
//		return 1;
//	}
//	else
//		printf("内存分配成功！");
//		
//	return 0;
//}


//int main()
//{
//    int num = 0;
//    scanf("%d", &num);
//
//    int* ptr = NULL;
//    ptr = (int*)malloc(num * sizeof(int));
//    printf("%p\n", ptr);
//    if (NULL != ptr)//判断ptr指针是否为空
//    {
//        int i = 0;
//        for (i = 0; i < num; i++)
//        {
//            *(ptr + i) = 0;
//        }
//    }
//    free(ptr);//释放ptr所指向的动态内存
//    printf("%p\n", ptr);
//    ptr = NULL;//是否有必要？
//    printf("%p\n", ptr);
//    return 0;
//}


//int main()
//{
//	int* p = (int*)calloc(10, sizeof(int));
//
//	if (p == NULL)
//	{
//		perror("calloc");
//		return 1;//不正常返回
//	}
//	else
//	{
//		for (int i = 0; i < 10; i++)
//		{
//			printf("%d ", *(p + i));
//		}
//	}
//	free(p);
//	p = NULL;
//	
//	return 0;
//}


//int main()
//{
//	int* p = (int*)calloc(10,sizeof(int));
//
//	//assert(p);
//	printf("开辟的内存地址：%p\n", p);
//	if (p == NULL)
//	{
//		perror("calloc");
//		return 1;
//	}
//	/*else
//	{
//		for (int i = 0; i < 10; i++)
//		{
//			printf("%d ", *(p + i));
//		}
//	}*/
//
//	int* ptr = realloc(p, 80);
//	//assert(ptr);
//	if (ptr == NULL)
//	{
//		perror("realloc");
//		return 1;
//	}
//	else
//	{
//		p = ptr;
//		printf("新的内存地址为：%p \n", p);
//	}
//	//free(p);
//	free(ptr);
//	p = NULL;
//	ptr = NULL;
//	return 0;
//}


//
//void test()
//{
//	int* p = (int*)malloc(100);
//	if (p != NULL)
//	{
//		*p = 1;
//	}
//}



//常见的动态内存错误
//int main()
//{
	//1. 对NULL指针的解引用操作
	//int* p = (int*)malloc(10 * (sizeof(int)));

	//*p = 20;//若p为NULL空指针，就会有问题

	//free(p);

	//2. 对动态开辟空间的越界访问
	//int* p1 = (int*)malloc(40);
	//if (p1 == NULL)
	//{
	//	perror("malloc");
	//	return 1;
	//}

	//for (int i = 0; i < 10; i++)
	//{
	//	* (p1+i) = i;
	//}
	//for (int i = 0; i <= 10; i++)//循环了11次，越界访问
	//{
	//	printf("%d ", *(p1 + i));
	//}

	//free(p1);
	//p1 = NULL;
	//
	//3.  对⾮动态开辟内存使⽤free释放
	//int* p2 = (int*)malloc(40);
	//int arr[10] = { 0 };
	//p2 = arr;
	//free(p2);



	//4, 使⽤free释放⼀块动态开辟内存的⼀部分
	//int* p3 = (int*)malloc(40);
	//int i = 0;
	//for (i = 0; i < 10; i++)
	//{
	//	*p3 = i;
	//	p3++;
	//}

	//free(p3);

	//5. 内存泄漏
	/*int* p4 = (int*)malloc(40);
	while (1);*/

	//test();
	//while (1);

//	return 0;
// }




